/*
 * @Date: 2025-01-03 10:26:57
 * @Author: LiSong
 * @LastEditors: LiSong
 * @LastEditTime: 2025-01-15 13:31:01
 * @Description: 数据压缩或解压工具类
 */

import { inflateRaw, deflateRaw } from 'pako';
import { fromByteArray, toByteArray } from 'base64-js';

// 是否开启压缩
const openPress = false
// 压缩数据前缀标识
const pressPrefix = 'PRESS:'
/**
 * 是否为压缩数据
 * 
 * @param {String} value 内容 
 * @returns 
 */
export const isPressData = (value) => {
  return value.startsWith(pressPrefix);
}

/**
 * 压缩字符串数据
 * 
 * @param {String} content 需要压缩的内容
 * @returns {String} 压缩后的数据
 */
export const compressData = (content) => {
  
  // 检查数据类型为对象是转换为字符串
  if (typeof content === 'object') {
    content = JSON.stringify(content)
  }

  // 不开启压缩直接返回
  if (!openPress) return content
  
  // 压缩数据
  const cData = deflateRaw(content);
  // 压缩数据转换为base64
  const sData = fromByteArray(cData);

  console.log(
    '压缩前长度:', content.length,
    '压缩后长度:', sData.length
  );

  return `${pressPrefix}${sData}`;
}

/**
 * 解压缩字符串数据
 * 
 * @param {String} content 需要解压的内容
 * @returns {String} 解压后的数据
 */
export const decompressData = (content) => {
  // 不开启压缩直接返回
  if (!openPress) return content
  // base64转换为二进制数据
  const cData = toByteArray(content.replace(pressPrefix, ''));
  // 解压数据
  const sData = inflateRaw(cData, {to: 'string'});

  /**
   * 是否为JSON字符串
   * 
   * @param {String} value 内容
   * @returns 
   */
  function isJSONString (value) {
    // 判断是否为JSON字符串
    try {
      JSON.parse(value)
      return true
    } catch (err) {
      console.log('非JOSN字符串')
      return false
    }
  }
  
  return isJSONString(sData) ? JSON.parse(sData) : sData;
}

